#include"nouvelle partie.h"
#include<stdio.h>
#include<stdlib.h>
#include <time.h>
#include"myconio.h"

int GR[9][9];
int T[9][9],pos_c,pos_l;
int sol[9][9];
float tpause=0;


 void affiche_grille_position(int GR[9][9],int T[9][9],int niveau_diff)
 {
int pos_ligne[25];
 int pos_col[25];
 int k,pl=2,nb,n1,n2,rep=0,idouble,i,j,x,y;
int test;
if(niveau_diff==1)
 {test=1;
 srand(time(NULL));
 n1=rand()%(10-1) +1;
 pos_ligne[0]=n1;
 n2=rand()%(10-1) +1;
 pos_col[0]=n2;
 for(pl=1;pl<20;pl++)
 {
 do
 {
 nb=rand()%(10-1) +1;
 k=0;
 rep=0;
 test=1;
 do
 { if(pos_ligne[k]==nb)
  {rep++;}
  k++;
 }
 while(k<pl);
 if(rep>=3)
 {test=0;}
}
 while(test==0);
 pos_ligne[pl]=nb;
 }




 /***tableau pos-colonne**/
 for(pl=1;pl<20;pl++)
 {
 do
 {
 nb=rand()%(10-1) +1;
 k=0;
 rep=0;
 test=1;
 do
 { if(pos_col[k]==nb)
  {rep++;}
  k++;
 }
 while(k<pl);
 if(rep>=3)
 {test=0;}
idouble=0;
do
{if((pos_col[idouble]==pos_col[pl])&&(pos_ligne[idouble]==pos_ligne[pl]))
{test=0;}
idouble++;
}
while(idouble<pl);
}
 while(test==0);
 pos_col[pl]=nb;

 }
 }
 else if (niveau_diff==2)
 {test=1;
 srand(time(NULL));
 n1=rand()%(10-1) +1;
 pos_ligne[0]=n1;
 n2=rand()%(10-1) +1;
 pos_col[0]=n2;
 for(pl=1;pl<15;pl++)
 {
 do
 {
 nb=rand()%(10-1) +1;
 k=0;
 rep=0;
 test=1;
 do
 { if(pos_ligne[k]==nb)
  {rep++;}
  k++;
 }
 while(k<pl);
 if(rep>=3)
 {test=0;}
}
 while(test==0);
 pos_ligne[pl]=nb;
 }




 /***tableau pos-colonne**/
 for(pl=1;pl<15;pl++)
 {
 do
 {
 nb=rand()%(10-1) +1;
 k=0;
 rep=0;
 test=1;
 do
 { if(pos_col[k]==nb)
  {rep++;}
  k++;
 }
 while(k<pl);
 if(rep>=3)
 {test=0;}
idouble=0;
do
{if((pos_col[idouble]==pos_col[pl])&&(pos_ligne[idouble]==pos_ligne[pl]))
{test=0;}
idouble++;
}
while(idouble<pl);
}
 while(test==0);
 pos_col[pl]=nb;

 }
 }

 else
 {test=1;
 srand(time(NULL));
 n1=rand()%(10-1) +1;
 pos_ligne[0]=n1;
 n2=rand()%(10-1) +1;
 pos_col[0]=n2;
 for(pl=1;pl<10;pl++)
 {
 do
 {
 nb=rand()%(10-1) +1;
 k=0;
 rep=0;
 test=1;
 do
 { if(pos_ligne[k]==nb)
  {rep++;}
  k++;
 }
 while(k<pl);
 if(rep>=3)
 {test=0;}
}
 while(test==0);
 pos_ligne[pl]=nb;
 }




 /***tableau pos-colonne**/
 for(pl=1;pl<10;pl++)
 {
 do
 {
 nb=rand()%(10-1) +1;
 k=0;
 rep=0;
 test=1;
 do
 { if(pos_col[k]==nb)
  {rep++;}
  k++;
 }
 while(k<pl);
 if(rep>=3)
 {test=0;}
idouble=0;
do
{if((pos_col[idouble]==pos_col[pl])&&(pos_ligne[idouble]==pos_ligne[pl]))
{test=0;}
idouble++;
}
while(idouble<pl);
}
 while(test==0);
 pos_col[pl]=nb;

 }
 }



/***affiche grille***/
for (i=0;i<9;i++)
  { for (j=0;j<9;j++)
    {k=0;
    test=0;
    do
     { x=pos_ligne[k];
      y=pos_col[k];
      if((i==x)&&(j==y))
      {test=1;}
     k++;
     }
     while((test==0)&&(k<15));
     if(test==1)
     {T[i][j]=GR[i][j];}   //faut mettre valeur pour tester
     else
     {T[i][j]=0;}
    }

 }
 //textbackground(8);
 textcolor(11);

// fonction affiche_grille
printf("\n\n\n");
printf("\t     0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 \t\t\t");
printf("\n\t   ____________________________________\t\t\t");
printf("\n\t   ------------------------------------\t\t\t");
printf("\n");
for (i=0;i<9;i++)
 {textcolor(11);
  printf("\t%d |",i);
   printf("|");
     for (j=0;j<9;j++)
     {if(T[i][j]==0)
     {textcolor(0);}
     else
     {textcolor(11);}
    printf(" %d ",T[i][j]);
     if((j<9)&&(j!=2)&&(j!=5))
     {textcolor(11);
     printf("|");}
     else
     if(j!=8)
     {textcolor(11);
     printf("*");}}
     textcolor(11);
     printf("\t\t");
     printf("\n");
     if((i<8)&&(i!=2)&&(i!=5))
     {textcolor(11);
     printf("       -- ||-----------*-----------*-----------|\t\t");}
     else
     if(i!=8)
     { textcolor(11);
     printf("       -- |*************************************\t\t");}


  if(i==8)
  {printf(" \t   -------------------------------------\t\t");}
   printf("\n");
 }
 printf("\n");








 }
 int test_ligne( int T[9][9],int x,int pos_l,int pos_c)
{int i;
for(i=0;i<9;i++)
{if(x!=0)
{
if ((T[pos_l][i]==x)&&(pos_c!=i))
 return 0;
 }
}
 return 1;
}

int test_colonne(int T[9][9],int x,int pos_l,int pos_c)
{int i;
for(i=0;i<9;i++)
{if(x!=0)
{
    if ((T[i][pos_c]==x)&&(pos_l!=i))
 return 0;
}
}
return 1;
}


/****pause*/
 float pause( int GR[9][9])
  { int q;
    float s;
    time_t start, end;
    start = time(NULL);
    printf("pour retourner au jeu tappez 999 ");
    scanf("%d",&q);
    end = time(NULL);
    s=difftime(end, start);


    return s;
  }


/***enregistrer***/

void enregistrer(int GR[9][9],int sol[9][9])
 {
int i,j;
FILE*fichier;
FILE*fichier2;
 grille G,GS;
 for(i=0;i<9;i++)
 {for(j=0;j<9;j++)
 {G.tab[i][j]=GR[i][j];}}

 for(i=0;i<9;i++)
 {for(j=0;j<9;j++)
 {GS.tab[i][j]=sol[i][j];}}
fichier=fopen("c:\\sudokuenregistrer.txt","wb");
         if(fichier==NULL)
         printf("erreur");
         else
         {fwrite(&G,sizeof(grille),1,fichier);

         }
         fclose(fichier);
fichier2=fopen("c:\\sudokuenregistrersolution.txt","wb");
         if(fichier==NULL)
         printf("erreur");
         else
         {fwrite(&GS,sizeof(grille),1,fichier);

         }
         fclose(fichier2);


 }

 /***indication**/

 void indication(int sol[9][9],int pos_l,int pos_c)
{printf("\n \n \n");
printf("la valeur dans la position[%d][%d] est : %d",pos_l,pos_c,sol[pos_l][pos_c]);
printf("\n");
printf("tapez nimporte quelle touche pour continuer");
printf("\n");
getch();
}


/***solution**/

void solution(int sol[9][9])
{int i,j;
 clrscr();
 printf("***************** la solution de votre sudoku est ***************");
 printf("\n");
// fonction affiche_grille
printf("\n\n\n");
printf("\t     0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 \t\t\t");
printf("\n\t   ____________________________________\t\t\t");
printf("\n\t   ------------------------------------\t\t\t");
printf("\n");
for (i=0;i<9;i++)
 { printf("\t%d |",i);
   printf("|");
     for (j=0;j<9;j++)
     {printf(" %d ",sol[i][j]);
     if((j<9)&&(j!=2)&&(j!=5))
     {printf("|");}
     else
     if(j!=8)
     {printf("*");}}
     printf("\t\t");
     printf("\n");
     if((i<8)&&(i!=2)&&(i!=5))
     {printf("       -- ||-----------*-----------*-----------|\t\t");}
     else
     if(i!=8)
     { printf("       -- |*************************************\t\t");}


  if(i==8)
  {printf(" \t   -------------------------------------\t\t");}
   printf("\n");
 }

}

void quitter()
{exit(0);
}
void enregistrer_quitter(int GR[9][9],int sol[9][9])
{int i,j;
FILE*fichier;
FILE*fichier2;
 grille G,GS;
 for(i=0;i<9;i++)
 {for(j=0;j<9;j++)
 {G.tab[i][j]=GR[i][j];}}

 for(i=0;i<9;i++)
 {for(j=0;j<9;j++)
 {GS.tab[i][j]=sol[i][j];}}
fichier=fopen("c:\\sudokuenregistrer.txt","wb");
         if(fichier==NULL)
         printf("erreur");
         else
         {fwrite(&G,sizeof(grille),1,fichier);

         }
         fclose(fichier);
fichier2=fopen("c:\\sudokuenregistrersolution.txt","wb");
         if(fichier==NULL)
         printf("erreur");
         else
         {fwrite(&GS,sizeof(grille),1,fichier);

         }
         fclose(fichier2);
         exit(0);


 }








  /****apui touche */
void appui_touche(int GR[9][9],int sol[9][9],float *tpause,int pos_l,int pos_c)
{ int verif;
 float tempspaus;
 {clrscr();
  printf("\n\n");
  printf("   ******* tapez 0 : enregistrer ****************\n");
  printf("   ******* tapez 1 : pause **********************\n");
  printf("   ******* tapez 2 : enregistrer et quitter *****\n");
  printf("   ******* tapez 3 : retour au menu *************\n");
  printf("   ******* tapez 4 : quitter le jeu *************\n");
  printf("   ******* tapez 5 : indication *****************\n");
  printf("   ******* tapez 6 : solution *******************\n");
  printf("   ******* tapez 7 : retour a la partie **********\n");
 }
 scanf("%d",&verif);
 fflush(stdin);
  switch (verif)
 {
case 0 :enregistrer(GR,sol);break;
case 1 :{tempspaus=pause(GR);
        (*tpause)=tempspaus;
         };break;
case 2 :enregistrer_quitter(GR,sol);break;
case 3 :{clrscr();
         menu();}break;
case  4 :quitter();break;
case 5 :indication(sol,pos_l,pos_c);break;
case 6 :{solution(sol);getch();}break;
case 7 :break;

default:printf("veuillez taper un entier entre 0 et 7");


}

}



///****insertion
float insertion(int GR[9][9],int sol[9][9])
 {
    int ligne,colonne,val,x,y,i,j;

/*for(i=0;i<9;i++)
{for(j=0;j<9;j++)           //test pour succes
 {GR[i][j]=sol[i][j];
 }}*/
  printf("  donner la position dans laquelle vous voulez inserer la valeur \n");
 printf("          numero de ligne : ");
 scanf("%d",&ligne);
 printf("\n");
 printf("          numero de colonne : ");
 scanf("%d",&colonne);
 printf("\n");
 if((ligne==10)&&(colonne==10))
 {for(i=0;i<9;i++)
{for(j=0;j<9;j++)           //test pour succes
 {GR[i][j]=sol[i][j];
 }}
 return tpause;
 }
 printf("     donner la valeur que vous voulez inserer : ");
 scanf("%d",&val);
 if(val==100)
 {
     val=GR[ligne][colonne];
  appui_touche(GR,sol,&tpause,ligne,colonne);

 }

 GR[ligne][colonne]=val;
 x=test_ligne(GR,val,ligne,colonne);
 y=test_colonne(GR,val,ligne,colonne);
 if((x==0)||(y==0))
 {clrscr();
  //textbackground(8);
 textcolor(4);
 printf("   \n\n");
 printf(" valeur inapropriee:elle existe deja dans la meme ligne ou la meme colonne ");
}
else
{clrscr();
//textbackground(8);
 textcolor(11);
}
return tpause;
}






///*score*************//
float score( int n,float t)
{ float s;
if (n==1)
{s=t*100/3;}
 else if (n==2)
 {s=t*100/2;}

 else
 {s=t*100;
 }

//printf("votre score est: %f ",s);
printf("\n");
 return s;
 }





 ///*succes***/


int succes(int GR[9][9],int sol[9][9])
{int test=1;
int i,j;
for(i=0;i<9;i++)
{for(j=0;j<9;j++)
{if(GR[i][j]!=sol[i][j])
 test=0;
 }
}
if(test==0)
return 0;
else
return 1;
}





///*****fonction nouvelle partie//

int nouvelle_partie( int niveau_diff)
{int nombre_aleatoire =0,i,j,fin;
float s,p,scr;
time_t start, end;
 FILE*fichier;
 FILE*meilleur;
 scores MS;


 grille G;
  clrscr();
	srand(time(NULL)); // initialisation de rand
	nombre_aleatoire =rand()%(31-1) +1;
    /*printf("%d ",nombre_aleatoire);
    printf("\n");*/


   switch (nombre_aleatoire)
   {case 1 :fichier=fopen("c:\\sudokufichier1","rb");break;
    case 2 :fichier=fopen("c:\\sudokufichier2","rb");break;
    case 3 :fichier=fopen("c:\\sudokufichier3","rb");break;
    case 4 :fichier=fopen("c:\\sudokufichier4","rb");break;
    case 5 :fichier=fopen("c:\\sudokufichier5","rb");break;
    case 6 :fichier=fopen("c:\\sudokufichier6","rb");break;
    case 7 :fichier=fopen("c:\\sudokufichier7","rb");break;
    case 8 :fichier=fopen("c:\\sudokufichier8","rb");break;
    case 9 :fichier=fopen("c:\\sudokufichier9","rb");break;
    case 10:fichier=fopen("c:\\sudokufichier10","rb");break;
    case 11:fichier=fopen("c:\\sudokufichier11","rb");break;
    case 12:fichier=fopen("c:\\sudokufichier12","rb");break;
    case 13:fichier=fopen("c:\\sudokufichier13","rb");break;
    case 14:fichier=fopen("c:\\sudokufichier14","rb");break;
    case 15:fichier=fopen("c:\\sudokufichier15","rb");break;
    case 16:fichier=fopen("c:\\sudokufichier16","rb");break;
    case 17:fichier=fopen("c:\\sudokufichier17","rb");break;
    case 18:fichier=fopen("c:\\sudokufichier18","rb");break;
    case 19:fichier=fopen("c:\\sudokufichier19","rb");break;
    case 20:fichier=fopen("c:\\sudokufichier20","rb");break;
    case 21:fichier=fopen("c:\\sudokufichier21","rb");break;
    case 22:fichier=fopen("c:\\sudokufichier22","rb");break;
    case 23:fichier=fopen("c:\\sudokufichier23","rb");break;
    case 24:fichier=fopen("c:\\sudokufichier24","rb");break;
    case 25:fichier=fopen("c:\\sudokufichier25","rb");break;
    case 26:fichier=fopen("c:\\sudokufichier26","rb");break;
    case 27:fichier=fopen("c:\\sudokufichier27","rb");break;
    case 28:fichier=fopen("c:\\sudokufichier28","rb");break;
    case 29:fichier=fopen("c:\\sudokufichier29","rb");break;
    case 30:fichier=fopen("c:\\sudokufichier30","rb");break;
}
   if(fichier==NULL)
        printf("erreur");
       else
       {fread(&G,sizeof(grille),1,fichier);
       fclose(fichier);
        affiche_grille_position(G.tab,T,niveau_diff);



       ////////////////////////////
   /*    for(i=0;i<9;i++)
       {for(j=0;j<9;j++)
       {printf("%d  ",G.tab[i][j]);}
       }
       getch();

       }
*/


    start = time(NULL);
        do
    {

    p=insertion(T,G.tab);



/*clrscr();*/

// fonction affiche_grille
textcolor(11);
printf("\n\n\n");
printf("\t     0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 \t\t\t");
printf("\n\t   ____________________________________\t\t\t");
printf("\n\t   ------------------------------------\t\t\t");
printf("\n");
for (i=0;i<9;i++)
 { textcolor(11);
 printf("\t%d |",i);
   printf("|");
     for (j=0;j<9;j++)
     {if(T[i][j]==0)
     {textcolor(0);}
     else
     {textcolor(11);}
        printf(" %d ",T[i][j]);
     if((j<9)&&(j!=2)&&(j!=5))
     {textcolor(11);
     printf("|");}
     else
     if(j!=8)
     {textcolor(11);
     printf("*");}}
     textcolor(11);
     printf("\t\t");
     printf("\n");
     if((i<8)&&(i!=2)&&(i!=5))
     {textcolor(11);
     printf("       -- ||-----------*-----------*-----------|\t\t");}
     else
     if(i!=8)
     {textcolor(11);
      printf("       -- |*************************************\t\t");}


  if(i==8)
  {printf(" \t   -------------------------------------\t\t");}
   printf("\n");
 }







}
    while(succes(G.tab,T)==0);
    end = time(NULL);
     s=difftime(end, start);
     s=s-p;
     scr=score(niveau_diff,s);
    if(succes(G.tab,T)==1)
    {clrscr();
     meilleur=fopen("c:\\meilleurscore","rb");
     fread(&MS,sizeof(scores),1,meilleur);
     fclose(meilleur);
        if(MS.mscore<scr)
    {
    MS.mscore=scr;
    printf("votre nom SVP ");
     scanf("%s",MS.nom);
    fflush(stdin);
    //***fichier
    meilleur=fopen("c:\\meilleurscore","wb");
    fwrite(&MS,sizeof(scores),1,meilleur);
    fclose(meilleur);
    printf("******************************* MEILLEUR SCORE *******************************");
    }
     printf("********************************************************************************");
     printf("********************************************************************************");
     printf("**                                                                            **");
     printf("**  la partie est terminee avec succes avec le score est egale a : %2.f       **",scr);
     printf("**                                                                            **");

     printf("********************************************************************************");
     printf("\n");
     printf("pour quitter  tappez n'importe quelle chiffre ");
     scanf("%d",&fin);
     exit(0);

    }
fclose(fichier);
}

 return 0;}
